In questa pagina puoi ottenere un'analisi dettagliata di una parola o frase, prodotta utilizzando la migliore tecnologia di intelligenza artificiale fino ad oggi:
Идиома copy-and-swap — это идиома языка программирования C++, позволяющая разрабатывать устойчивые к исключениям операторы присваивания.
Идиома базируется на идиоме «Получение ресурса есть инициализация».
Идиома предполагает реализацию следующих функций-членов класса:
Пример:
Устойчивость к исключениям заключается в том, что в операторе присваивания Copyable& operator=(const Copyable &)
нет точки, где генерация исключения могла бы привести к утечке памяти.
Оператор присваивания сначала пытается захватить ресурс «временная копия присваиваемого объекта» (tmp
) и в случае успеха меняет его содержимое с содержимым текущего объекта (this
). Поскольку метод swap
объявлен как не генерирующий исключения (noexcept
), единственной точкой, где может возникнуть исключение, является копирование объекта _v
. Если копирование не удается, то управление не доходит до метода swap
, в противном случае деструктор объекта tmp
освобождает ресурсы, прежде принадлежавшие текущему объекту (this
) (см. идиому RAII).
Приведённая выше реализация также устойчива к присваиваниям объекта самому себе (a=a
), однако содержит издержки, связанные с тем, что временная копия в этом случае тоже будет создаваться. Исключить издержки можно дополнительной проверкой:
Многие контейнеры и алгоритмы стандартной библиотеки C++ и библиотеки STL предполагают наличие устойчивого к исключениям оператора присваивания, но без использования идиомы copy-and-swap иногда довольно сложно реализовать такой оператор присваивания для классов, содержащих, например, указатели на экземпляры других классов.